﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
using System.Data.SqlClient;
using ddcCajamarca.BusinessEntities.Directorio;
using ddcCajamarca.Repository.Directorio.Service;

namespace ddcCajamarca.Repository.Directorio
{
    public class PersonaRepository : MasterRepository, IPersonaRepository
    {
        public Persona GetFromPersonaById(int id)
        {
            var querry = from p in Context.Personas.Include("TipoDocumento")
                             .Include("Ubigeo").Include("DetallePersonaActividades.Actividad")
                             .Include("DetalleOrganizacionContactos.Organizacion")
                         where p.Id.Equals(id)
                         select p;

            return querry.SingleOrDefault();

        }

        public int GetPersonaByDNI(string dni, int iddoc, string opcion, Int32 id)
        {
            try
            {
                var query = Context.Database.SqlQuery<Persona>("exec dbo.PersonaFromDNI @nroDocumento = '"
                    + dni + "', @TipoDoc = '"
                    + iddoc + "'").SingleOrDefault();

                if (opcion == "Editar" && query.Id == id)
                {
                    return 1;
                }
                else
                {
                    return 0;//0 = Nuevo
                }

            }
            catch (Exception)
            {
                
                if (opcion == "Editar" && id>=0)
                {
                    return 1;//1 = Modificar
                }
                else
                {
                    return 0;
                }
            }
        }

        public IEnumerable<Persona> GetPersonasByNombreActividadCiudad(string nombre, string actividad, string ciudad)
        {
            if (actividad.ToUpper().Contains("--") || actividad.ToUpper().Contains("TODAS") || actividad.ToUpper().Contains("TODOS")) actividad = null;
            
                var query = from c in Context.Personas
                                .Include("Profesion")
                                .Include("Vocativo")

                            select c;

                if (!String.IsNullOrEmpty(nombre) && nombre != string.Empty)
                {
                    query = from c in query
                            where c.Nombre.ToUpper().Contains(nombre.ToUpper()) ||
                            c.Apellidos.ToUpper().Contains(nombre.ToUpper()) ||
                            c.NumeroDocumento.Contains(nombre)

                            select c;
                }


                return query;
            
            
        }

        public IEnumerable<PersonaDTO> GetPersonasByCriterios(string criterio, string actividad, string ubigeo, string organizacion, int Autoridad)
        {
            var query = Context.Database.SqlQuery<PersonaDTO>("exec dbo.GetAllPersonasByCriterios @criterioprincipal = '" + criterio
                + "', @actividad = '" + actividad
                + "', @ubigeo = '" + ubigeo
                + "', @organizacion = '" + organizacion + "'"
                + ", @autoridad=" + Autoridad).ToList();

            return query;
        }

        public void AddPersona(Persona persona)
        {
            try
            {
                var query = Context.Database.SqlQuery<Persona>("exec dbo.NewPersonaReturn @NombreArtistico = '"
                + persona.NombreArtistico + "', @Nombre = '"
                + persona.Nombre + "', @Apellidos = '"
                + persona.Apellidos + "', @NumeroDocumento = '"
                + persona.NumeroDocumento + "', @Direccion = '"
                + persona.Direccion + "', @Direccion2 = '"
                + persona.Direccion2 + "', @Telefono = '"
                + persona.Telefono + "', @Telefono2 = '"
                + persona.Telefono2 + "', @Telefono3 = '"
                + persona.Telefono3 + "', @FechaReg = '"
                + persona.FechaReg + "', @FechaNac = '"
                + persona.FechaNac + "', @Email = '"
                + persona.Email + "', @PaginaWeb = '"
                + persona.PaginaWeb + "', @Autoridad = '"
                + persona.Autoridad + "', @Imagen = '"
                + persona.Imagen + "', @idTipoDoc = '"
                + persona.idTipoDoc + "', @idProfesion = '"
                + persona.idProfesion + "', @idVocativo = '"
                + persona.idVocativo + "', @idUbigeo = '"
                + persona.idUbigeo + "'").SingleOrDefault();

                persona.Id = query.Id;

                foreach (var detalle in persona.DetallePersonaActividades)
                {
                    Context.Database.ExecuteSqlCommand("exec dbo.NewDetallePersonaActividad @IdPersona = '"
                        + persona.Id + "', @IdActividad = '"
                        + detalle.Actividad.Id + "', @FechaRegistro = '"
                        + detalle.FechaRegistro + "', @Comentario = '"
                        + detalle.Comentario + "'");
                }

                foreach (var detalle in persona.DetalleOrganizacionContactos)
                {
                    Context.Database.ExecuteSqlCommand("exec dbo.NewDetallePersonaOrganización @FechaRegistro = '"
                        + detalle.FechaRegistro + "', @Estado = '"
                        + detalle.Estado + "', @Cargo = '"
                        + detalle.Cargo + "', @IdPersona = '"
                        + persona.Id + "', @IdOrganizacion = '"
                        + detalle.IdOrganizacion + "'");
                }
            }
            catch (Exception)
            {
            }
        }

        public void UpdatePersona(Persona persona)
        {
            try
            {
                Context.Database.ExecuteSqlCommand("dbo.DeleteDetallePersona @IdPersona = '"
                + persona.Id + "'");

                foreach (var detalle in persona.DetallePersonaActividades)
                {
                    Context.Database.ExecuteSqlCommand("exec dbo.UpdateDetallePersonaActividadNewUpdate @IdPersona = '"
                    + persona.Id + "', @IdActividad = '"
                    + detalle.Actividad.Id + "', @FechaRegistro = '"
                    + detalle.FechaRegistro + "', @Comentario = '"
                    + detalle.Comentario + "'");
                }

                int count = 1;

                foreach (var detalle in persona.DetalleOrganizacionContactos)
                {
                    if (count == persona.DetalleOrganizacionContactos.Count)
                    {
                        Context.Database.ExecuteSqlCommand("dbo.DeleteDetalleOrganizacionCargo @IdPersona = '"
                        + persona.Id + "', @IdOrganizacion = '"
                        + detalle.IdOrganizacion + "'");

                        Context.Database.ExecuteSqlCommand("exec dbo.NewDetallePersonaOrganización @FechaRegistro = '"
                            + detalle.FechaRegistro + "', @Estado = '"
                            + detalle.Estado + "', @Cargo = '"
                            + detalle.Cargo + "', @IdPersona = '"
                            + persona.Id + "', @IdOrganizacion = '"
                            + detalle.IdOrganizacion + "'");
                        break;
                    }

                    count++;
                }

                Context.Database.ExecuteSqlCommand("exec dbo.UpdatePersona @id = '"
                    + persona.Id + "', @NombreArtistico = '"
                    + persona.NombreArtistico + "', @Nombre = '"
                    + persona.Nombre + "', @Apellidos = '"
                    + persona.Apellidos + "', @NumeroDocumento = '"
                    + persona.NumeroDocumento + "', @Direccion = '"
                    + persona.Direccion + "', @Direccion2 = '"
                    + persona.Direccion2 + "', @Telefono = '"
                    + persona.Telefono + "', @Telefono2 = '"
                    + persona.Telefono2 + "', @Telefono3 = '"
                    + persona.Telefono3 + "', @FechaReg = '"
                    + persona.FechaReg + "', @FechaNac = '"
                    + persona.FechaNac + "', @Email = '"
                    + persona.Email + "', @PaginaWeb = '"
                    + persona.PaginaWeb + "', @Autoridad = '"
                    + persona.Autoridad + "', @Imagen = '"
                    + persona.Imagen + "', @idTipoDoc = '"
                    + persona.idTipoDoc + "', @idProfesion = '"
                    + persona.idProfesion + "', @idVocativo = '"
                    + persona.idVocativo + "', @idUbigeo = '"
                    + persona.idUbigeo + "'");
            }
            catch (Exception)
            {
            }
        }

        public void DeletePersona(int id)
        {
            var existe = Context.Personas.Find(id);

            try
            {
                if (existe != null)
                {
                    var detalleEventoExist = Context.DetalleEventoOrganizadores.Where(deorg => deorg.OrganizacionId == id).FirstOrDefault();
                    if (detalleEventoExist != null)
                    {
                        Context.DetalleEventoOrganizadores.Remove(detalleEventoExist);
                        Context.SaveChanges();
                    }
                    // Detalle organizacion relacion con persona.
                    var detalleOrganizacion = Context.DetalleOrganizacionContactos.Where(dorg => dorg.IdPersona == id).FirstOrDefault();

                    if (detalleOrganizacion != null)
                    {
                        Context.DetalleOrganizacionContactos.Remove(detalleOrganizacion);
                        Context.SaveChanges();
                    }

                    // Verifica existencia de la persona con relacion a una actividad
                    var detalleExist = Context.DetallePersonaActividades.Where(dpa => dpa.IdPersona == id).FirstOrDefault();

                    // Elimina primero la relacion con actividad.
                    if (detalleExist != null)
                    {
                        Context.DetallePersonaActividades.Remove(detalleExist);
                        Context.SaveChanges();
                    }
                    // Elimina la persona.
                    Context.Personas.Remove(existe);
                    Context.SaveChanges();
                }
            }
            catch (Exception)
            {
            }
        }

        public Persona GetPersonaById(int id)
        {
            return Context.Personas.Find(id);
        }

        //consulta para ver todas las personas que cumplen anios
        public List<Persona> GetAllPersonasByFechCumpleaños()
        {
            var query = Context.Database.SqlQuery<Persona>("exec dbo.PersonasByCumpleaños");
            return query.ToList();

        }
    }
}
